package com.money.tracker.auth.enums;

import com.money.tracker.auth.entity.SysMenu;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.apache.commons.lang3.StringUtils;

/**
 * <p>
 *
 * <p>
 *
 * @author zhangshuai
 * &#064;@date 2024/10/07
 */
@Getter
@AllArgsConstructor
public enum MenuTypeEnum {
    /**
     * 菜单
     */
    MENU("C", "菜单"),
    /**
     * 按钮
     */
    BUTTON("F", "按钮"),

    /**
     * 目录
     */
    CATALOG("M", "目录");

    private final String code;
    private final String desc;

    public static Boolean isMenu(String code) {
        return MENU.getCode().equals(code);
    }

    public static Boolean isButton(String code) {
        return BUTTON.getCode().equals(code);
    }

    public static Boolean isCatalog(String code) {
        return CATALOG.getCode().equals(code);
    }

    /**
     * 是否为菜单内部跳转
     *
     * @param menu 菜单信息
     * @return 结果
     */
    public static boolean isMenuFrame(SysMenu menu) {
        return menu.getParentId().intValue() == 0 && isMenu(menu.getMenuType())
                && FrameEnum.noFrame(menu.getIsFrame());
    }

    /**
     * 非外链并且是一级目录（类型为目录）
     */
    public static boolean isCatalogFrame(SysMenu menu) {
        return 0 == menu.getParentId().intValue() && isCatalog(menu.getMenuType())
                && FrameEnum.noFrame(menu.getIsFrame());
    }

    /**
     * 是否为parent_view组件
     */
    public static boolean isParentView(SysMenu menu) {
        return menu.getParentId().intValue() != 0 && isCatalog(menu.getMenuType());
    }


    /**
     * 获取路由地址
     *
     * @param menu 菜单信息
     * @return 路由地址
     */
    public static String getRouterPath(SysMenu menu) {
        String routerPath = menu.getPath();
        // 内链打开外网方式
        if (FrameEnum.isInnerLink(menu)) {
            return StringUtils.replaceEach(menu.getPath(), new String[]{"http", "https", "www", "."},
                    new String[]{"", "", "", "/"});
        }
        // 非外链并且是一级目录（类型为目录）
        if (MenuTypeEnum.isCatalog(menu.getMenuType())) {
            return "/" + menu.getPath();
        }
        // 非外链并且是一级目录（类型为菜单）
        if (MenuTypeEnum.isMenuFrame(menu)) {
            return "/";
        }
        return routerPath;
    }

    /**
     * 获取路由名称
     *
     * @param menu 菜单信息
     * @return 路由名称
     */
    public static String getRouteName(SysMenu menu) {
        String routerName = StringUtils.capitalize(menu.getPath());
        // 非外链并且是一级目录（类型为目录）
        if (MenuTypeEnum.isMenuFrame(menu)) {
            routerName = StringUtils.EMPTY;
        }
        return routerName;
    }

}
